package models

import (
	"time"

	"gorm.io/gorm"
)

// Brand 品牌表实体
// @TableName BRAND
type Brand struct {
	BrandID    uint      `gorm:"primaryKey;autoIncrement;column:BRAND_ID" json:"brand_id"`
	BrandName  string    `gorm:"type:varchar(180);not null;column:BRAND_NAME" json:"brand_name"`
	BrandLogo  string    `gorm:"type:varchar(500);not null;column:BRAND_LOGO" json:"brand_logo"`
	BrandIntro string    `gorm:"type:longtext;column:BRAND_INTRO" json:"brand_intro"`
	CreateTime time.Time `gorm:"type:datetime;not null;default:CURRENT_TIMESTAMP;column:CREATE_TIME" json:"create_time"`
	UpdateTime time.Time `gorm:"type:datetime;not null;default:CURRENT_TIMESTAMP;autoUpdateTime;column:UPDATE_TIME" json:"update_time"`
}

// TableName 指定表名
func (Brand) TableName() string {
	return "BRAND"
}

// BCategory 商品分类表实体
// @TableName B_CATEGORY
type BCategory struct {
	BCategoryID    uint      `gorm:"primaryKey;autoIncrement;column:B_CATEGORY_ID" json:"b_category_id"`
	BCategoryName  string    `gorm:"type:varchar(180);not null;column:B_CATEGORY_NAME" json:"b_category_name"`
	BCategoryLevel uint8     `gorm:"type:int(2);not null;column:B_CATEGORY_LEVEL" json:"b_category_level"`
	ParentID       uint      `gorm:"type:int;not null;column:PARENT_ID" json:"parent_id"`
	IsLeaf         uint8     `gorm:"type:int(2);not null;column:IS_LEAF" json:"is_leaf"`
	SortOrder      int       `gorm:"type:int(4);not null;column:SORT_ORDER" json:"sort_order"`
	Status         uint8     `gorm:"type:int(2);not null;default:0;column:STATUS" json:"status"`
	CreateTime     time.Time `gorm:"type:datetime;not null;default:CURRENT_TIMESTAMP;column:CREATE_TIME" json:"create_time"`
	UpdateTime     time.Time `gorm:"type:datetime;not null;default:CURRENT_TIMESTAMP;autoUpdateTime;column:UPDATE_TIME" json:"update_time"`

	// 关联关系
	Parent   *BCategory   `gorm:"foreignKey:ParentID" json:"parent,omitempty"`
	Children []*BCategory `gorm:"foreignKey:ParentID" json:"children,omitempty"`
}

// TableName 指定表名
func (BCategory) TableName() string {
	return "B_CATEGORY"
}

// FCategory F分类表实体
// @TableName F_CATEGORY
type FCategory struct {
	FCategoryID    uint      `gorm:"primaryKey;autoIncrement;column:F_CATEGORY_ID" json:"f_category_id"`
	FCategoryName  string    `gorm:"type:varchar(180);not null;column:F_CATEGORY_NAME" json:"f_category_name"`
	FCategoryLevel uint8     `gorm:"type:int(2);not null;column:F_CATEGORY_LEVEL" json:"f_category_level"`
	ParentID       uint      `gorm:"type:int;not null;column:PARENT_ID" json:"parent_id"`
	IsLeaf         uint8     `gorm:"type:int(2);not null;column:IS_LEAF" json:"is_leaf"`
	SortOrder      int       `gorm:"type:int(4);not null;column:SORT_ORDER" json:"sort_order"`
	Status         uint8     `gorm:"type:int(2);not null;default:0;column:STATUS" json:"status"`
	CreateTime     time.Time `gorm:"type:datetime;not null;default:CURRENT_TIMESTAMP;column:CREATE_TIME" json:"create_time"`
	UpdateTime     time.Time `gorm:"type:datetime;not null;default:CURRENT_TIMESTAMP;autoUpdateTime;column:UPDATE_TIME" json:"update_time"`
	LogoURL        string    `gorm:"type:varchar(180);not null;column:LOGO_URL" json:"logo_url"`

	// 关联关系
	Parent   *FCategory   `gorm:"foreignKey:ParentID" json:"parent,omitempty"`
	Children []*FCategory `gorm:"foreignKey:ParentID" json:"children,omitempty"`
}

// TableName 指定表名
func (FCategory) TableName() string {
	return "F_CATEGORY"
}

// FB_Cate F分类与B分类关联表实体
// @TableName F_B_CATE
type FB_Cate struct {
	MapID       uint      `gorm:"primaryKey;autoIncrement;column:MAP_ID" json:"map_id"`
	FCategoryID uint      `gorm:"type:int;not null;column:F_CATEGORY_ID" json:"f_category_id"`
	BCategoryID uint      `gorm:"type:int;not null;column:B_CATEGORY_ID" json:"b_category_id"`
	SortOrder   int       `gorm:"type:int(4);not null;column:SORT_ORDER" json:"sort_order"`
	Status      uint8     `gorm:"type:int(2);not null;default:0;column:STATUS" json:"status"`
	CreateTime  time.Time `gorm:"type:datetime;not null;default:CURRENT_TIMESTAMP;column:CREATE_TIME" json:"create_time"`
	UpdateTime  time.Time `gorm:"type:datetime;not null;default:CURRENT_TIMESTAMP;autoUpdateTime;column:UPDATE_TIME" json:"update_time"`

	// 关联关系
	FCategory *FCategory `gorm:"foreignKey:FCategoryID" json:"f_category,omitempty"`
	BCategory *BCategory `gorm:"foreignKey:BCategoryID" json:"b_category,omitempty"`
}

// TableName 指定表名
func (FB_Cate) TableName() string {
	return "F_B_CATE"
}

// SPU 标准化产品单元表实体
// @TableName SPU
type SPU struct {
	SPUID       uint      `gorm:"primaryKey;autoIncrement;column:SPU_ID" json:"spu_id"`
	BCategoryID uint      `gorm:"type:int;not null;column:B_CATEGORY_ID" json:"b_category_id"`
	BrandID     uint      `gorm:"type:int;not null;column:BRAND_ID" json:"brand_id"`
	SPUName     string    `gorm:"type:varchar(180);not null;column:SPU_NAME" json:"spu_name"`
	SPUDesc     string    `gorm:"type:longtext;column:SPU_DESC" json:"spu_desc"`
	Status      uint8     `gorm:"type:int(2);not null;default:0;column:STATUS" json:"status"`
	CreateTime  time.Time `gorm:"type:datetime;not null;default:CURRENT_TIMESTAMP;column:CREATE_TIME" json:"create_time"`
	UpdateTime  time.Time `gorm:"type:datetime;not null;default:CURRENT_TIMESTAMP;autoUpdateTime;column:UPDATE_TIME" json:"update_time"`

	// 关联关系
	BCategory *BCategory `gorm:"foreignKey:BCategoryID" json:"b_category,omitempty"`
	Brand     *Brand     `gorm:"foreignKey:BrandID" json:"brand,omitempty"`
	SKUs      []*SKU     `gorm:"foreignKey:SPUID" json:"skus,omitempty"`
}

// TableName 指定表名
func (SPU) TableName() string {
	return "SPU"
}

// SKU 库存保有单位表实体
// @TableName SKU
type SKU struct {
	SKUID      uint      `gorm:"primaryKey;autoIncrement;column:SKU_ID" json:"sku_id"`
	SPUID      uint      `gorm:"type:int;not null;column:SPU_ID" json:"spu_id"`
	SKUName    string    `gorm:"type:varchar(200);not null;column:SKU_NAME" json:"sku_name"`
	Price      float64   `gorm:"type:decimal(10,2);not null;column:PRICE" json:"price"`
	CostPrice  float64   `gorm:"type:decimal(10,2);column:COST_PRICE" json:"cost_price"`
	Stock      int       `gorm:"type:int;not null;default:0;column:STOCK" json:"stock"`
	WarnStock  int       `gorm:"type:int;not null;default:5;column:WARN_STOCK" json:"warn_stock"`
	Status     uint8     `gorm:"type:int(2);not null;default:0;column:STATUS" json:"status"`
	CreateTime time.Time `gorm:"type:datetime;not null;default:CURRENT_TIMESTAMP;column:CREATE_TIME" json:"create_time"`
	UpdateTime time.Time `gorm:"type:datetime;not null;default:CURRENT_TIMESTAMP;autoUpdateTime;column:UPDATE_TIME" json:"update_time"`

	// 关联关系
	SPU *SPU `gorm:"foreignKey:SPUID" json:"spu,omitempty"`
}

// TableName 指定表名
func (SKU) TableName() string {
	return "SKU"
}

// Param 参数表实体
// @TableName PARAM
type Param struct {
	ParamID     uint      `gorm:"primaryKey;autoIncrement;column:PARAM_ID" json:"param_id"`
	BCategoryID uint      `gorm:"type:int;not null;column:B_CATEGORY_ID" json:"b_category_id"`
	SPUID       *uint     `gorm:"type:int;column:SPU_ID" json:"spu_id"`
	ParamType   uint8     `gorm:"type:int(2);not null;column:PARAM_TYPE" json:"param_type"`
	ParamName   string    `gorm:"type:varchar(180);not null;column:PARAM_NAME" json:"param_name"`
	Status      uint8     `gorm:"type:int(2);not null;default:0;column:STATUS" json:"status"`
	CreateTime  time.Time `gorm:"type:datetime;not null;default:CURRENT_TIMESTAMP;column:CREATE_TIME" json:"create_time"`
	UpdateTime  time.Time `gorm:"type:datetime;not null;default:CURRENT_TIMESTAMP;autoUpdateTime;column:UPDATE_TIME" json:"update_time"`

	// 关联关系
	BCategory *BCategory `gorm:"foreignKey:BCategoryID" json:"b_category,omitempty"`
	SPU       *SPU       `gorm:"foreignKey:SPUID" json:"spu,omitempty"`
}

// TableName 指定表名
func (Param) TableName() string {
	return "PARAM"
}

// ItemParam 商品参数表实体
// @TableName ITEM_PARAM
type ItemParam struct {
	ItemParamID uint      `gorm:"primaryKey;autoIncrement;column:ITEM_PARAM_ID" json:"item_param_id"`
	ParamID     uint      `gorm:"type:int;not null;column:PARAM_ID" json:"param_id"`
	SPUID       uint      `gorm:"type:int;not null;column:SPU_ID" json:"spu_id"`
	ParamName   string    `gorm:"type:varchar(180);not null;column:PARAM_NAME" json:"param_name"`
	ParamValue  string    `gorm:"type:varchar(180);not null;column:PARAM_VALUE" json:"param_value"`
	CreateTime  time.Time `gorm:"type:datetime;not null;default:CURRENT_TIMESTAMP;column:CREATE_TIME" json:"create_time"`
	UpdateTime  time.Time `gorm:"type:datetime;not null;default:CURRENT_TIMESTAMP;autoUpdateTime;column:UPDATE_TIME" json:"update_time"`

	// 关联关系
	Param *Param `gorm:"foreignKey:ParamID" json:"param,omitempty"`
	SPU   *SPU   `gorm:"foreignKey:SPUID" json:"spu,omitempty"`
}

// TableName 指定表名
func (ItemParam) TableName() string {
	return "ITEM_PARAM"
}

// ItemImage 商品图片表实体
// @TableName ITEM_IMAGE
type ItemImage struct {
	ImageID    uint      `gorm:"primaryKey;autoIncrement;column:IMAGE_ID" json:"image_id"`
	SPUID      *uint     `gorm:"type:int;column:SPU_ID" json:"spu_id"`
	SKUID      *uint     `gorm:"type:int;column:SKU_ID" json:"sku_id"`
	ImageURL   string    `gorm:"type:varchar(180);not null;column:IMAGE_URL" json:"image_url"`
	ImageType  uint8     `gorm:"type:int(2);not null;column:IMAGE_TYPE" json:"image_type"`
	SortOrder  int       `gorm:"type:int(4);not null;column:SORT_ORDER" json:"sort_order"`
	CreateTime time.Time `gorm:"type:datetime;not null;default:CURRENT_TIMESTAMP;column:CREATE_TIME" json:"create_time"`
	UpdateTime time.Time `gorm:"type:datetime;not null;default:CURRENT_TIMESTAMP;autoUpdateTime;column:UPDATE_TIME" json:"update_time"`

	// 关联关系
	SPU *SPU `gorm:"foreignKey:SPUID" json:"spu,omitempty"`
	SKU *SKU `gorm:"foreignKey:SKUID" json:"sku,omitempty"`
}

// TableName 指定表名
func (ItemImage) TableName() string {
	return "ITEM_IMAGE"
}

// AutoMigrate 自动迁移所有模型
func AutoMigrate(db *gorm.DB) error {
	return db.AutoMigrate(
		&Brand{},
		&BCategory{},
		&FCategory{},
		&FB_Cate{},
		&SPU{},
		&SKU{},
		&Param{},
		&ItemParam{},
		&ItemImage{},
	)
}
